/**
 * MapUtil.java
 */
package com.mht2017.common.utils;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author yutong.xiao
 * @date 2017年7月17日 上午10:57:52
 */
public class MapUtil {

	/**
	 * 使key和value反转：<br/>
	 *
	 * <pre>
	 * 本来是key -> value，改为 value -> key
	 * </pre>
	 *
	 * @return 返回key和value反转的map
	 */
	public static Map<String, Set<String>> invertKeyAndValue(Map<String, Set<String>> keyValues) {
		if (null == keyValues) {
			return null;
		}

		Map<String, Set<String>> invertMap = new HashMap<>();
		for (Iterator<Entry<String, Set<String>>> iterator = keyValues.entrySet().iterator(); iterator.hasNext();) {
			Entry<String, Set<String>> entry = iterator.next();
			invertOne(invertMap, entry.getKey(), entry.getValue());
		}
		return invertMap;
	}

	private static void invertOne(Map<String, Set<String>> invertMap, String key, Set<String> values) {
		if (null != values) {
			for (String value : values) {
				Set<String> set = invertMap.get(value);
				if (null == set) {
					invertMap.put(value, set = new HashSet<>());
				}
				set.add(key);
			}
		}
	}

	/**
	 * 针对Map中，一个key对应多个值的情况，当第一次put进去的时候，需要繁琐的判断。该方法就专门做这个繁琐的判断<br/>
	 *
	 * @param map
	 *            要操作的map，key可以是任意类型，但是value必须Set类型
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void mapVHashSetPutAdd(Map map, Object key, Object value) {
		if (null == map || null == value) {
			return;
		}

		Set set = (Set) map.get(key);
		if (null == set) {
			map.put(key, set = new HashSet());
		}
		set.add(value);
	}

	/**
	 * 针对Map中，一个key对应多个值的情况，当第一次put进去的时候，需要繁琐的判断。该方法就专门做这个繁琐的判断<br/>
	 *
	 * @param map
	 *            要操作的map，key可以是任意类型，但是value必须Set类型
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void mapVHashSetPutAddAll(Map map, Object key, Collection value) {
		if (null == map || null == value) {
			return;
		}

		Set set = (Set) map.get(key);
		if (null == set) {
			map.put(key, set = new HashSet());
		}
		set.addAll(value);
	}

}
